/*
 * Thread.h
 *
 */

#ifndef THREAD_H_
#define THREAD_H_

#include <exception>
#include <iostream>
#include <pthread.h>

class ThreadException : public std::exception {
	private:
		std::string msg;
	public:
		explicit ThreadException(const std::string& msg) throw();
		virtual ~ThreadException() throw() {}
		const char* what() const throw() { return msg.c_str(); }
};

class Thread {
	private:
		pthread_t ptr;
		bool dead;
		static void* func(void* datos);
		Thread& operator=(const Thread&);  // prohibido
		Thread(const Thread&);  // prohibido
	public:
		Thread() {}
		virtual ~Thread();

		/**
		 * procedimiento a realizar por el hilo
		 */
		virtual void run() = 0;

		/**
		 * pone en funcionamiento al hilo
		 * @throw ThreadException En caso de error en lanzamiento
		 */
		void start();

		/**
		 * espera a que el hilo termine
		 */
		void join();

		/**
		 * devuelve true si el hilo esta marcado para morir. Utilizarlo como
		 * condicion en loops infinitos.
		 */
		bool isDead() const;

		/**
		 * marca al hilo como muerto. Utilizarlo al finalizar el scope del
		 * hilo en cuestion
		 */
		void die();
};

#endif  /* THREAD_H_ */
